package com.unitd.base.module.master.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Maps;
import com.unitd.base.frame.util.BeanUtils;
import com.unitd.base.frame.util.DateUtils;
import com.unitd.base.module.comm.enums.DeleteFlagEnum;
import com.unitd.base.module.comm.enums.StatusEnum;
import com.unitd.base.module.comm.utils.CharUtil;
import com.unitd.base.module.comm.utils.Constant;
import com.unitd.base.module.master.mybatis.mapper.TokenMapper;
import com.unitd.base.module.master.pojo.po.TokenPO;
import com.unitd.base.module.master.service.TokenService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.Map;

/**
 * token处理的业务逻辑处理类
 *
 * @author Token
 * @version 1.0
 * @filename TokenServiceImpl.java
 * @copyright www.pactera.com
 * @date 2020-08-28
 */
@Slf4j
@Service
public class TokenServiceImpl extends ServiceImpl<TokenMapper, TokenPO> implements TokenService {

    @Autowired
    private TokenMapper tokenMapper;

    /**
     * 根据当前登录用户ID,得到该用户的登录token,如果不存在则直接常见token
     *
     * @param userId 当前登录用户ID
     * @return 用户token
     */
    @Transactional
    @Override
    public Map<String, Object> createToken(long userId) {
        // 生成一个token
        String token = CharUtil.getRandomString(32);
        //当前时间
        Date now = new Date();
        // 过期时间
        Date expireTime = new Date(now.getTime() + Constant.TOKEN_EXPIRE * 1000);

        //判断是否生成过token
        TokenPO tokenBean = tokenMapper.selectByUserId(userId);
        if (BeanUtils.isNull(tokenBean)) {
            tokenBean = new TokenPO();
            // 登录用户ID
            tokenBean.setUserId(userId);
            // 用户token
            tokenBean.setToken(token);
            // 过期时间
            tokenBean.setExpireTime(expireTime);
            //生效状态
            tokenBean.setStatus(StatusEnum.ONE.getCode());
            //是否已删除
            tokenBean.setDeleteFlag(DeleteFlagEnum.NO.getCode());
            //创建时间
            tokenBean.setCreateTime(DateUtils.getCurrDate(DateUtils.TIMESTAMP_PATTERN));
            //更新时间
            tokenBean.setUpdateTime(DateUtils.getCurrDate(DateUtils.TIMESTAMP_PATTERN));
            // 保存token
            tokenMapper.insert(tokenBean);
        } else {
            tokenBean.setToken(token);
            tokenBean.setExpireTime(expireTime);

            // 更新token
            tokenMapper.updateById(tokenBean);
        }

        Map<String, Object> map = Maps.newHashMap();
        map.put("token", token);
        map.put("expire", Constant.TOKEN_EXPIRE);
        return map;
    }

    /**
     * 根据用户访问Token得到该用户的登录token信息
     *
     * @param token 用户访问token
     * @return 用户token信息
     */
    @Override
    public TokenPO selectByToken(String token) {
        return tokenMapper.selectByToken(token);
    }

    /**
     * 根据用户访问Token得到该用户的用户ID
     *
     * @param tokenStr 用户访问token
     * @return 用户ID
     */
    @Override
    public Long getUserIdByToken(String tokenStr) {
        // 查询token信息
        TokenPO token = selectByToken(tokenStr);
        if (token == null || token.getExpireTime().getTime() < System.currentTimeMillis()) {
            return null;
        }
        return token.getUserId();
    }
}